package negocios;

import java.util.Date;

/**
 * Classe abstrata que representa uma mensagem de correio eletronico. Uma
 * mensagem contem um remetente, um assunto e uma data de envio. Implementa o
 * padrao Template Method.
 * 
 * @author Jonathan Brilhante
 * @author Jose Rafael
 * @author Nata Venancio
 * @author Renato Almeida
 * 
 * @version 2.0
 */

public abstract class MensagemAbstrata implements Mensagem {
	protected static final String ENDL = System.getProperty("line.separator");
	protected boolean lida;
	protected boolean excluida;
	protected String remetente;
	protected String para;
	protected String assunto;
	protected Date dataEnvio;

	/**
	 * Cria uma mensagem abstrata de correio eletronico
	 * 
	 * @param remetente
	 *            o remetente da mensagem
	 * @param para
	 *            o receptor da mensagem
	 * @param assunto
	 *            o assunto da mensagem
	 */
	protected MensagemAbstrata(String remetente, String para, String assunto) {
		this(remetente, para, assunto, new Date());
	}

	/**
	 * Cria uma mensagem abstrata de correio eletronico
	 * 
	 * @param remetente
	 *            o remetente da mensagem
	 * @param para
	 *            o receptor da mensagem
	 * @param assunto
	 *            o assunto da mensagem
	 * @param data
	 *            a data de envio
	 */
	protected MensagemAbstrata(String remetente, String para, String assunto,
			Date data) {
		this.remetente = remetente;
		this.assunto = assunto;
		this.para = para;
		dataEnvio = data;
		lida = excluida = false;
	}

	public String getRemetente() {
		return remetente;
	}

	public String getDestinatario() {
		return para;
	}

	public String getAssunto() {
		return assunto;
	}

	public Date getDataEnvio() {
		return dataEnvio;
	}

	public boolean isLida() {
		return lida;
	}

	public boolean isExcluida() {
		return excluida;
	}

	public void excluir() {
		excluida = true;
	}

	public void marcarNaoExcluida() {
		excluida = false;
	}

	public void lida() {
		lida = true;
	}

	public void marcarNaoLida() {
		lida = false;
	}

	/**
	 * Responde se uma mensagem e igual a outra, isto e, se possui remetente e
	 * assunto iguais
	 * 
	 * @return true caso sejam iguais, false caso contrario
	 */
	public boolean equals(Object objeto) {
		if (!(objeto instanceof Mensagem)) {
			return false;
		}
		Mensagem outra = (Mensagem) objeto;
		return getRemetente().equals(outra.getRemetente())
				&& getAssunto().equals(outra.getAssunto());
	}

	public String toString() {
		StringBuilder out = new StringBuilder();
		out.append(cabecalho());
		out.append(corpo());
		return out.toString();
	}

	/**
	 * Retorna o cabecalho de qualquer mensagem
	 * 
	 * @return o cabecalho de qualquer mensagem
	 */
	private String cabecalho() {
		return "From: " + remetente + ENDL + "to: " + para + ENDL;
	}

	/**
	 * Retorna uma String com o corpo da mensagem
	 * 
	 * @return uma String com o corpo da mensagem
	 */
	protected abstract String corpo();
}